/* PROGRAM TO SUM THE SQUARES OF THE ELEMENTS OF A VECTOR */ /* COMPILED FOR A COLDFIRE MCF5282 PROCESSOR */ #include #define LENGTH 5 void sumsq (int *total, int size, int array[]); short int data[] ={2,3,5,7,9}; short int sum; int main( { sumsq(&sum, LENGTH, data[]); output(sum); calls operating system trap } void sumsq (int *sum, int size, int array[]) { int total=0; for (int i = size-1; i < 0; i--) total= total + array[i]**2; sum=total; } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; PROGRAM TO SUM THE SQUARES OF THE ELEMENTS OF A VECTOR ; COMPILED FOR A COLDFIRE MCF5282 PROCESSOR ; -Assembly Statements- -Address Contents- -CPU Cycles(Mem Reads/ ; Mem Writes)- .org 0x3000 ; arbitrarily placed program here ; VARIABLES data: dc.w 2,3,5,7,9 ; define data array 0x3000 0002 0003 0005 0007 0009 sum: ds.w 1 ; set aside space for sum 0x300A ???? ; MAIN FUNCTION main: link a6, #0 ; called function overhead: a6=sp 0x300C 4E56 0000 2(0/1) movem.l do-d7/a0-a5,-(sp) ; push all registers 0x3010 48D7 3FFF 15(0/14) pea sum ; push addr of sum onto stk 0x3014 487A FFFA 2(0/1) move.w #5,-(sp) ; push #5 onto stack 0x3018 3F3C 0005 3(1/1) pea data ; push addr of data onto stk 0x301C 487A FFE8 2(0/1) jsr sumsq ; jump to subr sumsq 0x3020 4EBA 0004 3(0/1) trap #2 ; trap to vector 2 0x3024 4E42 15(1/2) movem.l (sp)+,do-d7/a0-a5 ; called function overhead: pop regs 0x3026 4CD7 3FFF 15(14/0) unlk a6 ; restore a6 0x302A 4E5D 2(1/0) move.l (sp),(-2,sp) ; move return adress 0x302C 2F57 FFFE 3(1/1) move.w #0,(sp) ; return 0: no error 0x3030 3EBC 0000 3(0/1) adda.l #-2,sp ; clean up stack 0x3034 EFFC FFFF FFFE 1(0/0) rts ; return from main 0x303A 4E75 5(1/0) ; SUMSQ FUNCTION sumsq: link a6,#0 ; called function overhead: a6=sp 0x303C 4E56 0000 2(0/1) movem.l d0-d2/a0-a1,-(sp) ; push reg onto stk 0x3040 48D7 0307 6(0/5) movea.l (8,a6),a0 ; load a0 with addr of array 0x3044 206E 0008 3(1/1) move.w (12,a6),d1 ; load d1 with size 0x3048 322E 000C 3(1/0) movea.l (14,a6),a1 ; load a1 with addr of sum 0x304C 222E 000E 3(1/1) moveq #0,d0 ; d0=0 (accumulator) 0x3050 7000 1(0/0) subq.l #1,d1 ; dec d1 (counter) 0x3052 5381 1(0/0) loop: move.w (a0)+,d2 ; pop array element into d2 0x3054 30C2 3(1/0) mulu d2,d2 ; square array element 0x3056 C4C2 4(0/0) add.l d2,d0 ; add sq to d0 0x3058 D082 1(0/0) subq.l #1,d1 ; dec d1 0x305A 5381 1(0/0) bne loop ; branch if not done 0x305C 66F6 2(0/0) 3(0/0) move.w d0,(a1) ; store sum 0x305E 3280 1(0/1) movem.l (sp)+,do-d2/a0-a1 ; called function overhead: pop regs 0x3060 4CD7 0307 6(5/0) unlk a6 ; restore a6 0x3064 4E5D 2(1/0) move.l (sp),(10,sp) ; move return address 0x3066 2F57 000A 3(1/1) adda.l #10,sp ; clean up the stack 0x306A EFFC 0000 000A 1(0/0) rts ; return from subr 0x3070 4E75 5(1/0) end - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - STACK: Memory Addr Contents sp --> 0xFFFF FF9A xxxx xxxx a1 top of stack in middle of sumsq 0xFFFF FF9E xxxx xxxx a0 0xFFFF FFA2 xxxx xxxx d2 0xFFFF FFA6 xxxx xxxx d1 0xFFFF FFAA xxxx xxxx d0 0xFFFF FFAE xxxx xxxx a6 sp -> a6 0xFFFF FFB2 xxxx xxxx return PC addr 0xFFFF FFB6 xxxx xxxx addr of data 0xFFFF FFBA 0005 #5 0xFFFE FFBC xxxx xxxx addr of sum 0xFFFE FFC0 xxxx xxxx a5 top of stack before calling sumsq, & after return to main 0xFFFE FFC4 xxxx xxxx a4 0xFFFE FFC8 xxxx xxxx a3 0xFFFE FFCC xxxx xxxx a2 0xFFFE FFD0 xxxx xxxx a1 0xFFFE FFD4 xxxx xxxx a0 0xFFFE FFD8 xxxx xxxx d7 0xFFFE FFDC xxxx xxxx d6 0xFFFE FFE0 xxxx xxxx d5 0xFFFE FFE4 xxxx xxxx d4 0xFFFE FFE8 xxxx xxxx d3 0xFFFE FFEC xxxx xxxx d2 0xFFFE FFF0 xxxx xxxx d1 0xFFFE FFF4 xxxx xxxx d0 0xFFFE FFF8 xxxx xxxx a6 sp -> a6 0xFFFE FFFC xxxx xxxx return PC addr top of stack at beginning of main 0xFFFF 0000 ???? ???? ......